package com.itheima.tliasmanager.filter;

import com.itheima.tliasmanager.utils.ApplicationContext;
import com.itheima.tliasmanager.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * 登录校验过滤器：
 *    拦截所有请求，验证用户是否登录过
 */
@Slf4j
//@WebFilter("/*")
public class LoginFilter implements Filter {

    /**
     * 拦截所有请求方法
     *      实现登录验证
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //0.获取封装请求数据和响应数据的具体对象
        HttpServletRequest  request = (HttpServletRequest)servletRequest; //已经封装了，请求数据的所有内容
        HttpServletResponse response = (HttpServletResponse)servletResponse;//可以后续用于封装要响应的数据

        //1.获取请求路径
        //System.out.println("url:"+request.getRequestURL());
        //System.out.println("uri:"+request.getRequestURI());
        String url = request.getRequestURL().toString();
        log.info("Filter过滤请求路径：{}", url);

        //2.判断是否是登录
        if(url.contains("/login")){
            //如果是登录，则直接放行
            log.info("Filter过滤登录请求：直接放行");
            filterChain.doFilter(request, response); //执行登录请求
            return; //注意：登录后，回到过滤器执行过滤后的操作；直接返回，跳过过滤后的操作
        }

        //3.如果不是登录，获取令牌Token（请求头中：token=令牌）
        String token = request.getHeader("token");

        //4.判断令牌是否为空
        if( token == null ){
            log.info("Filter过滤请求：没有令牌，直接封装未授权响应结果");
            //如果令牌为空，直接封装处理结果（设置响应码401：未授权，前端统一处理401响应状态码，直接跳转登录页面）
            response.setStatus(401);
            return; //注意：登录后，回到过滤器执行过滤后的操作；直接返回，跳过过滤后的操作
        }

        //5.如果携带了令牌，则解析令牌
        try {
            JwtUtils.parseJWT( token );  //刷门禁卡
        } catch (Exception e) {
            log.info("Filter过滤请求：令牌无效，直接封装未授权响应结果");
            //如果解析令牌失败，则直接封装处理结果（设置响应码401：未授权，前端统一处理401响应状态码，直接跳转登录页面）
            response.setStatus(401);
            return; //注意：登录后，回到过滤器执行过滤后的操作；直接返回，跳过过滤后的操作
        }

        //6.如果解析令牌成功，放行
        log.info("Filter过滤请求：令牌有效，直接放行");
        filterChain.doFilter(request, response); //执行后续请求


    }
}
